# 数据驱动
import yaml

from commons.request_util import logger


#读取测试用例
def read_testcase(yaml_path):
    with open(yaml_path, encoding='utf-8') as f:
        case_list = yaml.safe_load(f)

        # 区分用例类型：单接口、数据驱动（正反例）、流程用例
        if len(case_list)>=2:
            print("流程用例")
            return [case_list]      # 再把列表封装一层，也就是返回[[{},{}]]格式
        else:
            if "parametrize" in dict(*case_list).keys():
                print("数据驱动用例")     # {}  ->  [{正例},{反例},{反例}]
                new_caseInfo = ddts(*case_list, yaml_path.name)
                return new_caseInfo
            else:
                print("单接口用例")      # [{}]
                return case_list


# 解析parametrize参数里的值,也就是把流程用例-多个单接口用例,就是要返回[{正例},{反例},{反例}]
#   parametrize:
#     - ["username", "password"]
#     - ["123123", "123123"]
#     - ["121212", "121212"]
#     - ["232323", "232323"]
def ddts(caseInfo : dict, yaml_name):
    data_list = caseInfo["parametrize"]     # 取出数据驱动列表
    print(f"data_list:{data_list}")

    # 判断所有数据长度是正确的
    len_flag = True
    name_len = len(data_list[0])        # 获取参数的个数
    for data in data_list:
        if len(data) != name_len:
            len_flag = False
            print("parametrize数据的个数不一致")
            logger.error(f"{yaml_name}的parametrize数据的个数不一致")
            break

    str_caseInfo = yaml.dump(caseInfo)      # 转换成字符串，为了后面的参数名替换
    new_caseInfo = []       # 存储替换后的参数

    if len_flag:
        # x y表示行列
        for x in range(1,len(data_list)):   # 从第一行开始 因为第0行是参数名
            raw_caseInfo = str_caseInfo
            print(f"--行：{x}")
            for y in range(0,name_len):
                print(f"--列：{y},{data_list[0][y]},{data_list[x][y]}")
                # 对不带“”的参数进行特判
                if isinstance(data_list[x][y],str) and data_list[x][y].isdigit():
                    data_list[x][y] = "'" + data_list[x][y] + "'"

                # 替换用例里的变量
                raw_caseInfo = raw_caseInfo.replace("$ddt{" + data_list[0][y] + "}",str(data_list[x][y]))

            # 把每一行替换好的数据转换成字典后添加进新的用例列表中
            case_dict = yaml.safe_load(raw_caseInfo)
            case_dict.pop("parametrize")
            new_caseInfo.append(case_dict)
    print(f"数据驱动new_caseInfo:{new_caseInfo}")
    return new_caseInfo
